/*
 * 文件名：BaseException.java
 * 版权：〈版权〉
 * 描述：〈描述〉异常处理类
 * 修改时间：2015年6月3日
 * 修改内容：〈修改内容〉
 */

package com.zmkm.project.dbserver.utils;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

/**
 * 〈一句话功能简述〉 异常处理类 〈功能详细描述〉
 * 
 * @author chenl
 * @version [版本号, 2015年6月3日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class CustomException extends Exception {
    
    /** 序列化版本号 */
    private static final long serialVersionUID = 1280025786713661984L;
    
    /** 操作对象 */
    private Object operationObject = null;
    
    /** 错误信息 */
    private String errorMessage = null;
    
    /** 错误码 */
    private long errorId = -1L;
    
    /** 当前线程名 */
    private String currentThreadName = Thread.currentThread().getName();
    
    /**
     * 
     * 〈一句话功能简述〉 自定义异常 〈功能详细描述〉
     * 
     * @param errorID 错误码
     * @param cause 异常
     * @see [类、类#方法、类#成员]
     */
    public CustomException(long errorID, Throwable cause) {
        super(cause);
        this.errorId = errorID;
    }
    
    /**
     * 
     * 〈一句话功能简述〉 自定义异常 〈功能详细描述〉
     * 
     * @param errorID 错误码
     * @see [类、类#方法、类#成员]
     */
    public CustomException(long errorID) {
        this.errorId = errorID;
    }
    
    /**
     * 
     * 〈一句话功能简述〉 自定义异常 〈功能详细描述〉
     * 
     * @param errorId 错误码
     * @param operationObject 异常时正在操作的对象
     * @see [类、类#方法、类#成员]
     */
    public CustomException(long errorId, Object operationObject) {
        this.operationObject = operationObject;
        this.errorId = errorId;
    }
    
    /**
     * 
     * 〈一句话功能简述〉 自定义异常 〈功能详细描述〉
     * 
     * @param errorID 错误码
     * @param cause 异常
     * @param operationObject 异常时正在操作的对象
     * @see [类、类#方法、类#成员]
     */
    public CustomException(long errorID, Throwable cause,
        Object operationObject) {
        super(cause);
        this.operationObject = operationObject;
        this.errorId = errorID;
    }
    
    /**
     * 
     * 〈一句话功能简述〉获取错误信息 〈功能详细描述〉
     * 
     * @return 错误信息
     * @see [类、类#方法、类#成员]
     */
    public String getErrorMessage() {
        if (this.errorMessage == null) {
            // TODO
            // this.errorMessage =
            // ResourceManager.getMessage(String.valueOf(getErrorId()));
        }
        
        return this.errorMessage;
    }
    
    /**
     * 
     * 〈一句话功能简述〉获取操作对象 〈功能详细描述〉
     * 
     * @return 操作对象
     * @see [类、类#方法、类#成员]
     */
    public Object getOperationObject() {
        return this.operationObject;
    }
    
    /**
     * 
     * 〈一句话功能简述〉设置操作对象 〈功能详细描述〉
     * 
     * @param operationObject 操作对象
     * @see [类、类#方法、类#成员]
     */
    public void setOperationObject(Object operationObject) {
        this.operationObject = operationObject;
    }
    
    /**
     * {@inheritDoc}
     */
    public String getMessage() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
            .appendSuper(super.getMessage())
            .append("Current ThreadName:", this.currentThreadName)
            .append("Operation Object:", getOperationObject())
            .append("Error Code:", getErrorId())
            .append("Description:", getErrorMessage())
            .toString();
    }
    
    /**
     * 
     * 〈一句话功能简述〉设置错误消息 〈功能详细描述〉
     * 
     * @param msg 错误消息
     * @see [类、类#方法、类#成员]
     */
    public void setErrorMessage(String msg) {
        this.errorMessage = msg;
    }
    
    /**
     * 
     * 〈一句话功能简述〉获取错误码 〈功能详细描述〉
     * 
     * @return 错误码
     * @see [类、类#方法、类#成员]
     */
    public long getErrorId() {
        return this.errorId;
    }
    
    /**
     * 
     * 〈一句话功能简述〉获取当前线程的名字 〈功能详细描述〉
     * 
     * @return 当前线程的名字
     * @see [类、类#方法、类#成员]
     */
    public String getCurrentThreadName() {
        return currentThreadName;
    }
    
    /**
     * 
     * 〈一句话功能简述〉设置当前线程的名字 〈功能详细描述〉
     * 
     * @param currentThreadName 当前线程的名字
     * @see [类、类#方法、类#成员]
     */
    public void setCurrentThreadName(String currentThreadName) {
        this.currentThreadName = currentThreadName;
    }
}
